import { codeToText } from 'element-china-area-data'

/**
 * 地址工具函数
 */
export class AddressUtils {
  /**
   * 将地区代码转换为文本
   * @param code 地区代码
   * @returns 地区文本名称
   */
  static codeToText(code: string): string {
    return codeToText[code] || code
  }

  /**
   * 将地区文本转换为代码
   * @param text 地区文本名称
   * @returns 地区代码
   */
  static textToCode(text: string): string {
    const code = Object.keys(codeToText).find(key => codeToText[key] === text)
    return code || text
  }

  /**
   * 格式化完整地址
   * @param province 省份（代码或文本）
   * @param city 城市（代码或文本）
   * @param district 区县（代码或文本）
   * @param detailAddress 详细地址
   * @returns 格式化后的完整地址
   */
  static formatFullAddress(
    province: string,
    city: string,
    district: string,
    detailAddress: string
  ): string {
    const provinceText = this.codeToText(province)
    const cityText = this.codeToText(city)
    const districtText = this.codeToText(district)
    return `${provinceText} ${cityText} ${districtText} ${detailAddress}`
  }

  /**
   * 将地址对象转换为级联选择器需要的代码数组
   * @param address 包含省市区信息的地址对象
   * @returns 地区代码数组 [provinceCode, cityCode, districtCode]
   */
  static addressToRegionCodes(address: {
    province: string
    city: string
    district: string
  }): string[] {
    return [
      this.textToCode(address.province),
      this.textToCode(address.city),
      this.textToCode(address.district)
    ]
  }

  /**
   * 将级联选择器的代码数组转换为文本数组
   * @param regionCodes 地区代码数组 [provinceCode, cityCode, districtCode]
   * @returns 地区文本数组 [provinceText, cityText, districtText]
   */
  static regionCodesToTexts(regionCodes: string[]): string[] {
    return regionCodes.map(code => this.codeToText(code))
  }

  /**
   * 验证地区代码是否有效
   * @param code 地区代码
   * @returns 是否为有效的地区代码
   */
  static isValidRegionCode(code: string): boolean {
    return code in codeToText
  }

  /**
   * 验证地区文本是否有效
   * @param text 地区文本
   * @returns 是否为有效的地区文本
   */
  static isValidRegionText(text: string): boolean {
    return Object.values(codeToText).includes(text)
  }
}

/**
 * 地址相关的类型定义
 */
export interface AddressRegion {
  province: string
  city: string
  district: string
}

export interface FormattedAddress extends AddressRegion {
  detailAddress: string
  fullAddress?: string
}

/**
 * 便捷的导出函数
 */
export const {
  codeToText: convertCodeToText,
  textToCode: convertTextToCode,
  formatFullAddress,
  addressToRegionCodes,
  regionCodesToTexts,
  isValidRegionCode,
  isValidRegionText
} = AddressUtils